[Day 02] 工廠模式,策略模式,裝飾者模式


工廠模式

昨天介紹到當只有一個工廠時,所用的簡單工廠模式,但也提到一些問題:

  • 新增產品要直接修改工廠類別的程式碼 --> 違反開放/封閉原則
  • 當一個產品進行修改時,可能會影響其他產品

所以在工廠模式中進行下下列調整:

  • 工廠提升為抽象概念
  • 工廠介面只規範實體工廠類別應返回那些產品
  • 產品製作交由實體工廠實作

訓練營從原本的一座被獨立出來,弓箭手訓練營及鬥士訓練營是獨立出來的,也就是在修改弓箭手訓練流程,無需去動到鬥士,如果要新增冒險者類別就在新增一個類別,如劍士訓練營,完全不會影響抽象訓練營及現有實體訓練營,經過這樣的調整後才會符合開放/封閉原則。

抽象工廠模式

  • 用一個工廠介面來產生一系列相關的物件
  • 由實作工廠子類別來實現要建立那些物件
  • 工廠仍只是一個抽象介面
  • 但工廠非生產一種產品,而是生產一系列的產品

一個冒險者需要武器、頭盔、上衣、褲子、鞋子五種裝備,但若有四種不同的冒險者,此時則須建立20種工廠,會造成程式碼很龐大,不易維護,故靠工廠模式無法解決問題,此時將工廠定義由實體轉為抽象,抽象工廠生產一系列的裝備,而非單一的產品,則為抽象工廠模式。

小結 (各種工廠模式之比較)

  • 簡單工廠模式: 工廠直接負責生產所有產品,利用if else 或 switch case 判斷要生產的產品。
  • 工廠模式: 著重於如何生產一個物件。
  • 抽象工廠模式: 著重於產品的抽象關係,將兩個無關的產品透過抽象關係,在抽象工廠中進行生產。

策略模式

  • 將各種可互換的策略包裝成一個類別
  • 工廠模式的工廠類別並不會去使用產品,只關心如何建立物件,而策略模式的環境類別是使用外部傳入的策略類別,因此必須知道傳入策略的實際內容

冒險者訓練好後要去打怪,根據怪物種類會使用不同策略,例如說小怪物就隨便砍兩刀,強一點的怪物就要放技能之類的,在策略模式中,會由策略介面來進行規範,而各種戰鬥策略則是實體策略,使用實體策略的冒險者則為環境類別。

裝飾者模式

  • 動態的將功能附加在物件上

遊戲中冒險者可以透過各種冒險或訓練來獲取稱號,加強本身的能力,例如說"強壯的冒險者"攻擊力較強,"堅毅的冒險者"生命力較高,"炎龍的冒險者"可以讓敵人著火,剛開始會用一個冒險者介面,然後每一個稱號都是實作冒險者的子類別,然而這樣的架構在稱號越來越多時會產生非常多的子類別,現在只有三種可以選擇,所以只會有3!=6個子類別,但當有五種稱號可以選擇時,就多達5!=120種,而且還沒考慮可以取重複稱號的情況,為了避免發生建立很多子類別的狀況,所以使用裝飾者模式。首先抽象的冒險者介面裝飾者模式中就是被裝飾者,增加能利用的稱號介面就是裝飾者。

#寫作松 #設計模式







你可能感興趣的文章

[C#] 如何透過 EmailMessage 寄代理傳送者郵件 How to send an email on half of another user via EmailMessage

[C#] 如何透過 EmailMessage 寄代理傳送者郵件 How to send an email on half of another user via EmailMessage

Training with Different Image Shapes

Training with Different Image Shapes

《Designing Web APIs》ch2 API Paradigms

《Designing Web APIs》ch2 API Paradigms






留言討論